package main

import "fmt"

/*
	Go语言中的基础数据类型可以表示一些事物的基本属性，
	但是当我们想表达一个事物的全部或部分属性时，
	这时候再用单一的基本数据类型明显就无法满足需求了，
	Go语言提供了一种自定义数据类型，可以封装多个基本数据类型，
	这种数据类型叫结构体，英文名称struct
*/

//首字母小写(私有)，大写(公有)
type Person struct {
	Name string
	Age  int
	Sex  string
}

func main() {
	var p2 = new(Person)
	p2.Name = "张三"
	p2.Age = 30
	p2.Sex = "男"
	fmt.Printf("值：%#v，类型：%T\n", p2, p2) //值：&main.Person{Name:"张三", Age:30, Sex:"男"}，类型：*main.Person

	//在Golang中支持对结构体指针直接使用，来访问结构体的成员。p2.Name="张三"，其实底层是(*p2).Name="张三"
	fmt.Println((*p2).Name)
	fmt.Println(p2.Name)

	var p3 = &Person{}
	p3.Name = "王五"
	p3.Age = 25
	p3.Sex = "男"
	fmt.Printf("值：%#v，类型：%T\n", p3, p3) //值：&main.Person{Name:"王五", Age:25, Sex:"男"}，类型：*main.Person

	var p4 = Person{
		Name: "刘六",
		Age:  28,
		Sex:  "女",
	}
	fmt.Printf("值：%#v，类型：%T\n", p4, p4) //值：main.Person{Name:"刘六", Age:28, Sex:"女"}，类型：main.Person

	var p5 = &Person{
		Name: "王王",
		Age:  35,
		Sex:  "男",
	}
	fmt.Printf("值：%#v，类型；%T\n", p5, p5) //值：&main.Person{Name:"王王", Age:35, Sex:"男"}，类型；*main.Person

	var p6 = &Person{
		Name: "刘一",
	}
	fmt.Printf("值：%#v，类型；%T\n", p6, p6) //值：&main.Person{Name:"刘一", Age:0, Sex:""}，类型；*main.Person

	//初始化结构体的时候可以简写，也就是初始化的时候不写键，直接写值
	var p7 = Person{
		"李馨",
		3,
		"女",
	}
	fmt.Printf("值：%#v，类型：%T\n", p7, p7) //值：main.Person{Name:"李馨", Age:3, Sex:"女"}，类型：main.Person
}
